//
// Created by hsj on 2022/2/23.
//
#include <iostream>
#include <string>
#ifndef CLION_CPP_STACK_TEMPLATE_H
#define CLION_CPP_STACK_TEMPLATE_H
namespace t_class_template_test{
    using std::cout;
    using std::cin;
    using std::endl;
    using std::string;

    //不可以模板函数成员放在独立的实现文件cpp中

    template<class Type>
    class Stack{
        private:
            enum {MAX = 10};
            Type items[MAX];
            int top;
        public:
            Stack();
            bool isEmpty();
            bool isFull();
            bool push(const Type &item);
            bool pop(Type &item);
    };

    template<class Type>
    Stack<Type>::Stack(){
        top = 0;
    }

    template<class Type>
    bool Stack<Type>::isEmpty(){
        return top == 0;
    }

    template<class Type>
    bool Stack<Type>::isFull(){
        return top == MAX;
    }

    template<class Type>
    bool Stack<Type>::push(const Type &item){
        if (top >= MAX){
            return false;
        }
        items[top++] = item;
        return true;
    }

    template<class Type>
    bool Stack<Type>::pop(Type &item){
        if (top <= 0){
            return false;
        }
        item = items[top--];
        return true;
    }
    //测试使用
    void test();
}
#endif //CLION_CPP_STACK_TEMPLATE_H
